package com.fqyd.hrm.intercepter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.fqyd.hrm.model.User;

/**
 * 拦截器
 * @author FQYD
 * @date 2018年12月12日 下午3:59:12
 */
public class LoginHandlerIntercepter extends HandlerInterceptorAdapter {

	private static final Logger logger = LogManager.getLogger(LoginHandlerIntercepter.class);

	private static final String[] IGNORE_URI = { "/login.do", "/register.do" };

	/**
	 * preHandle方法是进行处理器拦截用的，该方法将在Controller处理之前进行调用，
	 * 当preHandle的返回值为false的时候整个请求就结束了。 
	 * 如果preHandle的返回值为true，则会继续执行postHandle和afterCompletion。
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		String uri = request.getRequestURI();

		if ("/".equals(uri.substring(request.getContextPath().length()))) {
			response.setCharacterEncoding("UTF-8");
			response.sendRedirect("index.do");
			return false;
		}

		for (String s : IGNORE_URI) {
			if (uri.contains(s)) {
				return true;
			}
		}

		User user = (User) request.getSession().getAttribute("loguser");
		if (user == null) {
			logger.debug("未登录，请先登录再访问网站！");
			request.setAttribute("message", "请先登录再访问网站！");
			request.getRequestDispatcher("/login.do").forward(request, response);
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 这个方法在preHandle方法返回值为true的时候才会执行。
	 * 执行时间是在处理器进行处理之 后，也就是在Controller的方法调用之后执行。
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

	}

	/**
	 * 该方法需要preHandle方法的返回值为true时才会执行。
	 * 该方法将在整个请求完成之后执行，主要作用是用于清理资源。
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

	}
}